/************************************************* 
 Copyright (C), 1988-1999, Huawei Tech. Co., Ltd. 
 File name: main.c// 文件名
 Author: GX		Version: 1.0 	Date: 
 Description: 	 ******规定头节点不存数据******
            用户在使用前要先确定存储数据的类型在下面 typedef xx datatype_t 中修改
            *************************************
            双向循环链表的基本功能：
			已经完成功能：
			创建节点	头插入	尾插入	链表拼接
			遍历输出链表所有数据	查找节点	
			删除节点	销毁链表	交换节点数据
            *************************************
 Others: // 其它内容的说明
 Function List: // 主要函数列表，每条记录应包括函数名及功能简要说明
        DCLinkList_t *createNode(datatype_t data)	创建一个节点
		DCLinkList_t *insertHead(DCLinkList_t *head, datatype_t data)	头插入
		DCLinkList_t *insertTial(DCLinkList_t *head, datatype_t data)	尾插入
		bool linkCat(DCLinkList_t *destlink, 
					DCLinkList_t *src, int model)			链表拼接
		bool ergodicLink(DCLinkList_t *head, 
                        void (*show)(datatype_t), int model)	遍历输出整个链表数据
		bool deleteNode(DCLinkList_t *node)				删除节点
		bool destoryLink(DCLinkList_t *head)				销毁链表
		DCLinkList_t *searchNode(DCLinkList_t* head, datatype_t data, 
                                bool(*cmp)(datatype_t , datatype_t));	查找节点
		bool swpData(DCLinkList_t *pos_a, DCLinkList_t *pos_b)	交换节点数据
 History: 
 1. Date:           2022/2/14	
    Author:         GX
    Modification:   build this mode
 2. Date:           2022/2/15	
    Author:         GX
    Modification:   delete function :
						void outputNode(DCLinkList_t *p)
					add function:
						bool linkCat(DCLinkList_t *destlink, 
						            DCLinkList_t *src, int model)
						bool destoryLink(DCLinkList_t *head)
						bool swpData(DCLinkList_t *pos_a,
									DCLinkList_t *pos_b)
 3. Date:           2022/2/16	
    Author:         GX
    Modification:   modify function linkCat(...)								
*************************************************/
#ifndef _AOO_SNAKE_LINKLIST_H_
#define _AOO_SNAKE_LINKLIST_H_

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include<string.h>

/**
 * @brief 贪吃蛇游戏的 方块定义
 * 
 */
typedef struct appSnake_block
{
	char 	pic_name[8];			/* 图片名字 */
	int   num;							/* 在链表中的编号 */
	int 	b_x;							/* 方块x坐标 */
	int 	b_y;							/* 方块y坐标 */
	int 	block_group;			/* 方块所属的区块 */
	int 	block_type;				/* 方块类型 */
	int 	direction;				/* 方块的方向 */
	int   block_effect1;		/* 方块的触发效果1 */
	int   block_effect2;		/* 方块的触发效果2 */
}appSnake_block_t;

typedef appSnake_block_t datatype_t;

typedef struct DCLinkList
{
    datatype_t *data;
    struct DCLinkList *prev;
    struct DCLinkList *next;
}DCLinkList_t;

typedef enum linkCatModel
{
    DestorySrc,
    SaveSrc
}linkCatModel;

/*创建节点*/
DCLinkList_t *createNode(datatype_t data);
/*创建一个链表*/
// MgDCLinkList_t *createCirLink(datatype data);

/*插入数据（头、尾、任意位置）*/
bool insertHead(DCLinkList_t *head, DCLinkList_t *newNode);
bool insertTial(DCLinkList_t *head, DCLinkList_t *newNode);
// bool insertPos(DCLinkList_t *prev, datatype_t data);

/*将一个链表拼接到另一个链表后面*/
bool linkCat(DCLinkList_t *destlink, DCLinkList_t *src, int model);

/*遍历输出整个链表的数据*/
bool ergodicLink(DCLinkList_t *head, void (*show)(datatype_t), int model);

/*删除数据*/
bool deleteNode(DCLinkList_t *node);
/*销毁链表*/
bool destoryLink(DCLinkList_t *head);

/*查找节点*/
DCLinkList_t *searchNode(DCLinkList_t* head, datatype_t data, bool(*cmp)(datatype_t , datatype_t));
// DCLinkList_t *searchPrevNode(DCLinkList_t *head, datatype_t data);

/*交换两个节点的数据*/
bool swpData(DCLinkList_t *pos_a, DCLinkList_t *pos_b);


/*将原链表倒序存储*/
// bool invert(DCLinkList_t *head);

#endif	/* _AOO_SNAKE_LINKLIST_H_ */